package com.atguigu.boot.config;


import com.atguigu.boot.bean.Pet;
import com.atguigu.boot.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

/**
 * Configuration告诉springboot这是一个配置类
 * 配置类里面使用@Bean标识的方法会放到容器里,默认为单实例
 * 配置类本身也是组件
 * proxyBeanMethods代表是不是代理bean的方法
 * 如果@Configuration(proxyBeanMethods = true)代理对象调用方法,springboot总会检查这个组件是否在容器中有,如果有就直接拿代理对象,没有就创建普通对象,保持一直 false就相反
 * 如果为true可以组件依赖 例如下方user01和tomcatPet互相依赖
 * 设置为false,运行起来会很快true每次都回去检查 所以推荐proxyBeanMethods = false
 * false=Lite模式   true=Full模式
 *
 * @Import是给容器中自动创建组件,默认组件的名字就是全类名,根据方法名创建的组件是@Bean创建的
 */
@Import({User.class})
@Configuration(proxyBeanMethods = true)
@ConditionalOnBean(name = "tom") //条件注解 当容器中有tom这个组件的时候,该组件才注册,没有就不注册
//@ConditionalOnMissingBean(name = "tom") //条件注解 当容器中有tom这个组件的时候,该组件不会,有就不注册  与ConditionalOnBean功能相反
//@ImportResource()  引入spring配置文件
public class Myconfig {

    /**
     * 外部无论对配置类这个组件注册方法调用多少次获取的都是注册到容器里的单例对象
     *
     * @return
     */
    @ConditionalOnBean(name = "tom") //条件注解 当容器中有tom这个组件的时候,该组件才注册,没有就不注册
    @Bean  //给容器中添加组件,以方方明作为id,返回类型就是组件类型,返回值的值就是实例
    public User user01() {
        User zhangsan = new User("zhangsan", 18);
        zhangsan.setPet(tomcatPet());
        return zhangsan;
    }


    //    @Bean("tom")  //给容器中添加组件,以方方明作为id,返回类型就是组件类型,返回值的值就是实例
    public Pet tomcatPet() {
        return new Pet("tomcat");
    }


}
